﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BookLibrary;

namespace BookApplication
{
    public partial class frmBoekenlijst : Form
    {
        public BookLibrary.Database database;
        private MyDataSet.BookRow Row;
        private int selectedRowInKlaslijstData = -1;
        private String selectedKlaslijst;
        MyDataSet.Klaslijst_BookRow kb;

        public frmBoekenlijst()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (!chbCategorie.Checked)
            {
                cmbCategorie.Enabled = false;
            }

            if (!chbUitgever.Checked)
            {
                cmbUitgever.Enabled = false;
            }

            database = Database.Instance ;

            //plaats alle cat in een array
            object[] categorieen = new object[database.categorieTable.Rows.Count];
            for (int i = 0; i < categorieen.Length; i++)
			{
			    categorieen[i] = database.categorieTable.Rows[i].ItemArray[1];
			}
            //gebruik de cat als datasource voor de dropdown
            cmbCategorie.DataSource = categorieen;

            //plaats alle uit in een array
            object[] uitgevers = new object[database.uitgeverTable.Rows.Count];
            for (int i = 0; i < uitgevers.Length; i++)
            {
                uitgevers[i] = database.uitgeverTable.Rows[i].ItemArray[1];
            }
            //gebruik de uit als datasource voor dropdown
            cmbUitgever.DataSource = uitgevers;

            //plaats alle klaslijsten in een array
            object[] klaslijsten = new object[database.klaslijstTable.Rows.Count];
            for (int i = 0; i < klaslijsten.Length; i++)
            {
                klaslijsten[i] = database.klaslijstTable.Rows[i].ItemArray[0];
            }
            //gebruik de klaslijsten als datasource voor de dropdown
            klasLijst.DataSource = klaslijsten;

            Row = null;
            //zorg dat er maar 1 rij per keer kangeselecteerd worden
            dgvAllBooks.MultiSelect = false;
            ApplyFilter();
        }

        private void chbCategorie_CheckedChanged(object sender, EventArgs e)
        {
            if (chbCategorie.Checked)
            {
                cmbCategorie.Enabled = true;
            }
            else
            {
                cmbCategorie.Enabled = false;
            }
        }

        private void chbUitgever_CheckedChanged(object sender, EventArgs e)
        {
            if (chbUitgever.Checked)
            {
                cmbUitgever.Enabled = true;
            }
            else
            {
                cmbUitgever.Enabled = false;
            }
        }

        private void txtTitel_TextChanged_1(object sender, EventArgs e)
        {
            ApplyFilter();
        }

        private void txtIsbn_TextChanged(object sender, EventArgs e)
        {
            ApplyFilter();
        }

        private void cmbCategorie_SelectedIndexChanged(object sender, EventArgs e)
        {
            ApplyFilter();
        }

        private void cmbUitgever_SelectedIndexChanged(object sender, EventArgs e)
        {
            ApplyFilter();
        }

        /**
         * filter op naam, ISBN, (eventueel cat / uit)
         */
        private void ApplyFilter()
        {
            clearBookDetail();
            var results = from book in database.bookTable
                          join cat in database.categorieTable on book.CategorieId equals cat.Id
                          join uit in database.uitgeverTable on book.UitgeverId equals uit.Id
                          //Dikke vette query
                          where (txtTitel.Text == "" || book.Titel.Contains(txtTitel.Text.ToUpper())) && (txtIsbn.Text == "" || book.Isbn.Contains(txtIsbn.Text)) && ((!chbCategorie.Checked) || cmbCategorie.SelectedItem.ToString().Equals(cat.Description)) && ((!chbUitgever.Checked) || cmbUitgever.SelectedItem.ToString().Equals(uit.Description))
                          select book;
            DataTable copy = new DataTable();
            if (results.ToArray().Length != 0)
            {
                copy = results.CopyToDataTable();
            copy.Columns.Remove("Isbn");
            copy.Columns.Remove("Status");
            copy.Columns.Remove("CategorieId");
            copy.Columns.Remove("UitgeverId");
            }

            dgvAllBooks.DataSource = copy;
        }

        private void clearBookDetail()
        {
            Row = null;
            bookDetail.Text = "";
        }

        /*
         * indien rij geklikt, plaats details onder lijst
         */
        private void dgvAllBooks_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            int rij = e.RowIndex;
            var detail = from book in database.bookTable
                         where book.Titel.Equals(dgvAllBooks.Rows[rij].Cells[0].Value.ToString())
                         select book;
            Row = detail.First();
            bookDetail.Text = "Titel: " + Row.Titel +
                "\nISBN: " + Row.Isbn +
                "\nUitgever: " + Row.UitgeverId + " Categorie: " + Row.CategorieId +
                "\nPrijs: " + Row.Prijs;
        }

        /*
         * gebruikt geselecteerde klaslijst als datasource
         */
        private void klasLijst_SelectedIndexChanged(object sender, EventArgs e)
        {
            selectedKlaslijst = klasLijst.SelectedValue.ToString();
            //Laad de klaslijst
            var query = from klas in database.klaslijstTable
                        join boeken in database.klas_bookTable on klas.Id equals boeken.KlaslijstId
                        join boek in database.bookTable on boeken.BookId equals boek.Isbn
                        where klas.Id.Equals(selectedKlaslijst)
                        select boek;
            DataTable copy = new DataTable();
            if (query.ToArray().Length != 0)
            {
                copy = query.CopyToDataTable();
                copy.Columns.Remove("Status");
            }
            klasLijstData.DataSource = copy;
        }

        /*
         * plaats boek in boekenlijst
         */
        private void naarRechts_Click(object sender, EventArgs e)
        {
            if (Row != null && selectedKlaslijst != null)
            {
                kb = (MyDataSet.Klaslijst_BookRow)database.klas_bookTable.NewRow();
                kb.BeginEdit();
                kb.KlaslijstId = selectedKlaslijst;
                kb.BookId = Row.Isbn;
                kb.EndEdit();
                try
                {
                    database.klas_bookTable.AddKlaslijst_BookRow(kb);
                }
                catch (Exception)
                {
                    MessageBox.Show("ERROR, row niet toegevoegd!");
                }
                klasLijst_SelectedIndexChanged(null, null);
            }
        }

        private void voegToe_Click(object sender, EventArgs e)
        {
            database.PersistKlasLijst();
        }

        private void annuleer_Click(object sender, EventArgs e)
        {
            database.Annuleer();
        }

        private void naarLijst_Click(object sender, EventArgs e)
        {
            naarRechts_Click(sender, e);
        }

        private void wisLijst_Click(object sender, EventArgs e)
        {
            int RowCount = klasLijstData.ColumnCount-2;
            while(RowCount > 0)
            {
                RowCount--;
                System.Diagnostics.Debug.WriteLine(RowCount + " " + RowCount);
                String isbn = klasLijstData.Rows[RowCount].Cells[1].Value.ToString();
                database.klas_bookAdapt.Delete(klasLijst.SelectedItem.ToString(), isbn);
                klasLijstData.Rows.Remove(klasLijstData.Rows[RowCount]);
            }
            database.UpdateClassList();
        }

        private void btnOverview_Click(object sender, EventArgs e)
        {
            Form form = new Overview();
            form.Show();
        }

        private void uitLijst_Click(object sender, EventArgs e)
        {
            naarLinks_Click(sender, e);
        }

        /*
         * verwijder boek uit lijst
         */
        private void naarLinks_Click(object sender, EventArgs e)
        {
            if (selectedRowInKlaslijstData > -1)
            {
                System.Diagnostics.Debug.WriteLine(klasLijstData.Rows[selectedRowInKlaslijstData].Cells[1].Value.ToString());
                String isbn = klasLijstData.Rows[selectedRowInKlaslijstData].Cells[1].Value.ToString();
                var detail = from book in database.bookTable
                             where book.Isbn.Equals(isbn)
                             select book;
                MyDataSet.BookRow Row = detail.First();
                klasLijstData.Rows.Remove(klasLijstData.Rows[selectedRowInKlaslijstData]);
                selectedRowInKlaslijstData = -1;
                database.klas_bookAdapt.Delete(klasLijst.SelectedItem.ToString(), detail.First().Isbn);
                database.UpdateClassList();
            }
        }

        private void klasLijstData_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            selectedRowInKlaslijstData = e.RowIndex;
        }
    }
}
